package cn.nucpyh.soft;

public class StringDeep {
    public static void main(String[] args) {
//        String s1 = "abc";
//        String s2 = "a"+ "b" + "c";
//        System.out.println(s1==s2);//true

        String s1 = "abc";//直接赋值:记录串池中的地址
        String s2 = "ab";
        String s3 = s2 + "c";//变量 + 赋值 -->创建一个新的字符串(new了一个)
        System.out.println(s1==s2);//false

//         字符串拼接的时候，如果有变量:
//        JDK8以前:系统底层会自动创建一个StringBuilder对象，然后再调用其append方法完成拼接。
//        拼接后，再调用其toString方法转换为String类型，而toString方法的底层是直接new了一个字符串对象。
//        JDK8版本∶系统会预估要字符串拼接之后的总大小，把要拼接的内容都放在数组中，此时也是产生一个新的字符串。

//        字符串原理小结:
//      扩展底层原理3:字符串拼接的底层原理
//      如果没有变量参与，都是字符串直接相加，编译之后就是拼接之后的结果，会复用串池中的字符串。如果有变量参与，每一行拼接的代码，都会在内存中创建新的字符串，浪费内存。
//      扩展底层原理4: StringBuilder提高效率原理图
    }
}
